﻿using System.Globalization;

namespace StockSharp.AlfaDirect
{
	using Ecng.Common;
	using StockSharp.BusinessEntities;
	using System;

	public static class AlfaUtils
	{
		/// <summary>
		/// Converts a board code to the security type
		/// </summary>
		/// <param name="boardCode">Код торгового раздела: FUTURES, MOPTIONS, MCX_SHR_LSTB, MCX_SHR_NLST...</param>
		/// <returns>Security type</returns>
		public static SecurityTypes BoardCodeToSecurityType(string boardCode)
		{
			SecurityTypes result;

			switch (boardCode)
			{
				case "FUTURES":
					result = SecurityTypes.Future;
					break;
				case "MOPTIONS":
					result = SecurityTypes.Option;
					break;
				default:
					result = SecurityTypes.Equity;
					break;
			}

			return result;
		}

		public static SecurityStates SecurityStateFromAlfa(string status)
		{
			return (status.To<int>() == 6) ? SecurityStates.Trading : SecurityStates.Stoped;
		}

		public static Exchange ExchangeCodeToExchange(string exCode)
		{
			Exchange exchange;

			switch (exCode)
			{
				case "FORTS":
				case "RTS":
					exchange = Exchange.Rts;
					break;
				case "MICEX":
					exchange = Exchange.Micex;
					break;
				default:
					exchange = new Exchange { Name = exCode };
					break;
			}

			return exchange;
		}

		public static OrderDirections OrderDirectionsFromAlfa (string buySell)
		{
			return buySell == "B" ? OrderDirections.Buy : OrderDirections.Sell;
		}

		public static OrderDirections OrderDirectionsFromAlfa(int buySell)
		{
			return buySell == 1 ? OrderDirections.Sell : OrderDirections.Buy;
		}

		public static string OrderDirectionsToAlfa(OrderDirections direction)
		{
			return direction == OrderDirections.Buy ? "B" : "S";
		}

		public static DateTime CancelTimeToAlfa(DateTime? cancelTime)
		{
			return cancelTime == null ? DateTime.Parse("23:55") : cancelTime.Value;
		}


        /// <summary>
        /// Метод возвращает истину если заявка лимитированная, иначе ложь.
        /// </summary>
        /// <remarks>Нет проверки на то что параметр не null</remarks>
        /// <param name="order">Заявка.</param>
        /// <returns>Истину или ложь</returns>
        public static bool IsLimit(this Order order)
        {
            return order.Type == OrderTypes.Limit;
        }
        /// <summary>
        /// Метод возвращает истину если заявка рыночная, иначе ложь.
        /// </summary>
        /// <remarks>Нет проверки на то что параметр не null</remarks>
        /// <param name="order">Заявка.</param>
        /// <returns>Истину или ложь</returns>
	    public static bool IsMarket(this Order order)
        {
            return order.Type == OrderTypes.Market;
        }
        /// <summary>
        /// Метод возвращает истину если стоп заявка, иначе ложь.
        /// </summary>
        /// <remarks>Нет проверки на то что параметр не null</remarks>
        /// <param name="order">Заявка.</param>
        /// <returns>Истину или ложь</returns>
	    public static bool IsStop(this Order order)
        {
            // Если заявка с условием и НЕ задан Трейлинг уровень, значит заявка всяко простой стоп.
            if (order.Type == OrderTypes.Conditional)
            {
                var stopCondition = (AlfaStopCondition)order.StopCondition;
                if (!stopCondition.IsNull())
                {
                    return stopCondition.TrailingLevel.IsNull();
                }

            }

            return false;
        }
        /// <summary>
        /// Метод возвращает истину если трейлинг стоп заявка, иначе ложь.
        /// </summary>
        /// <remarks>Нет проверки на то что параметр не null</remarks>
        /// <param name="order">Заявка.</param>
        /// <returns>Истину или ложь</returns>
        public static bool IsTrailingStop(this Order order)
        {
            // Если заявка с условием и задан Трейлинг уровень, значит заявка всяко трейлинг стоп.
            if (order.Type == OrderTypes.Conditional)
            {
                var stopCondition = (AlfaStopCondition) order.StopCondition;
                if (!stopCondition.IsNull())
                {
                    return !stopCondition.TrailingLevel.IsNull();
                }

            }

            return false;
        }

    }
}